﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SQLite;
using System.IO;
using System.Data;
using System.Windows.Forms;

namespace MwanaDOC
{
    /// <summary>
    /// Para matérias/disciplinas
    /// Pode ser modificado ou interpretado como Categorias ou qualquer outra classificação
    /// dependendo da implementação.
    /// </summary>
    public class Materia
    {
        private int idMateria;
        private string nome;
        private string prof_titular;
        private string sigla;
        private string periodo;
        private string ano;

        private Global gb = new Global();
        LogToFile lg = new LogToFile();

        #region Propriedades
        public int IdMateria
        {
            get { return idMateria; }
            set { idMateria = value; }
        }

        public string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        public string Prof_Titular
        {
            get { return prof_titular; }
            set { prof_titular = value; }
        }

        public string Sigla
        {
            get { return sigla; }
            set { sigla = value; }
        }

        public string Periodo
        {
            get { return periodo; }
            set { periodo = value; }
        }

        public string Ano
        {
            get { return ano; }
            set { ano = value; }
        } 
        #endregion

        /// <summary>
        /// Salva a Matéria/Disciplica
        /// </summary>
        /// <returns></returns>
        public bool Save()
        {
            bool result = false;
            DialogResult res = new DialogResult();
            string query = String.Format("insert into materia (Nome, Prof_Titular, Sigla, Periodo, Ano ) values( '{0}','{1}', '{2}', {3}, {4})", nome, prof_titular, sigla, periodo, ano);
            try
            {
                string pasta = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\MwanaDOC\\Disciplinas\\" + this.sigla;

                //Cria o diretório
                if (Directory.Exists(pasta))
                {
                    res = MessageBox.Show("Já existe uma disciplina com a sigla " + this.sigla + " \nOs documentos das duas disciplinas serão guardadas na mesma pasta\nDeseja continuar?", "Deseja manter a mesma pasta para as duas disciplinas?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (res == DialogResult.No)
                    {
                        result = false;
                    }
                    else if (res == DialogResult.Yes)
                    {
                        result = true;
                        gb.executa(query);
                    }
                }
                else {
                    Directory.CreateDirectory(pasta);
                    //salva os dados no banco
                    gb.executa(query);
                    result = true;
                }
                
                
                
                
            }
            catch (SQLiteException ex)
            {
                result = false;
                MessageBox.Show("Erro no banco de dados.\n ");
                lg.log(this.GetType().Name, "Materia.Save", ex.Message, ex.StackTrace);
            }
            catch (UnauthorizedAccessException ex)
            {
                result = false;
                MessageBox.Show("Erro: Acesso negado para criação da pasta para a disciplina.\n ");
                lg.log(this.GetType().Name, "Materia.Save", ex.Message, ex.StackTrace);
            }
            catch (ArgumentException ex)
            {
                result = false;
                MessageBox.Show("Erro desconhecido.\n ");
                lg.log(this.GetType().Name, "Materia.Save", ex.Message, ex.StackTrace);
            }
            catch (DirectoryNotFoundException ex)
            {
                result = false;
                MessageBox.Show("Erro:Diretório não encontrado.\n ");
                lg.log(this.GetType().Name, "Materia.Save", ex.Message, ex.StackTrace);
            }

            return result;
        }

        /// <summary>
        /// Retorna a lista das disciplinas/Matérias
        /// </summary>
        /// <returns></returns>
        internal SQLiteDataReader getListaDisciplinas()
        {
            string sql = "SELECT idMateria, Nome FROM Materia";

            //DataSet ds = new DataSet();
            SQLiteDataReader dr = null;
            //ds = gb.executaDataset(sql, "Materia");
            dr = gb.executeReader(sql);

            return dr;

        }

        /// <summary>
        /// Atualiza a disciplina
        /// </summary>
        /// <param name="siglaAtual">a sigla anterior</param>
        /// <returns></returns>
        internal bool Update(string siglaAtual)
        {
            bool passed = false;
            string pasta;
            try
            {
                pasta = Global.baseDir + "\\" + siglaAtual;
                if (Directory.Exists(pasta))
                {
                    DirectoryInfo dirInfo = new DirectoryInfo(pasta);
                    dirInfo.MoveTo(Global.baseDir + "\\" + this.sigla);
                }
                string sql = String.Format("UPDATE Materia SET Nome='{0}', Prof_Titular='{1}', Sigla='{2}', Periodo={3}, Ano={4} WHERE idMateria={5}", this.nome, this.prof_titular, this.sigla, this.periodo, this.ano, this.idMateria);
                gb.executa(sql);
                passed = true;
            }
            catch (SQLiteException e)
            {
                lg.log(this.GetType().Name, "Materia.Update", e.Message, e.StackTrace);
                //Voltar o nome original da pasta
                try
                {
                    if (Directory.Exists(Global.baseDir + "\\" + this.sigla))
                    {
                        DirectoryInfo dirInfo = new DirectoryInfo(Global.baseDir + "\\" + this.sigla);
                        dirInfo.MoveTo(Global.baseDir + "\\" + siglaAtual);
                    }
                }
                catch (Exception err)
                {
                    //Erro irreparável....
                    lg.log(this.GetType().Name, "Materia.Update", err.Message, err.StackTrace);
                }
                passed = false;
            }
            catch (IOException e)
            {
                MessageBox.Show("Falha no acesso ao disco","Impossível Renomear a pasta");
                lg.log(this.GetType().Name, "Materia.Update", e.Message, e.StackTrace);
            }
            return passed;
        }

        /// <summary>
        /// Verificação de código
        /// </summary>
        /// <param name="cod">O código a ser verificado</param>
        /// <returns></returns>
        internal object VerificaCodigo(int cod)
        {
            object codigo = null;
            string sql = "select idMateria FROM Materia WHERE idMateria=" + cod;
            try
            {
                codigo = gb.executaComResultado(sql);
            }
            catch (Exception e)
            {
                lg.log(this.GetType().Name, "Materia.VerificaCOdigo", e.Message, e.StackTrace);
            }

            return codigo;
        }
    }
}
